import re
'''
正则表达式是一个特殊的字符串序列、一种模式，用来判断字符串是否符合这种模式
基本语法
在正则表达式中，可以使用 \d 匹配数字，\w 匹配数字和子母，. 可以匹配除了换行符之外的任意字符，\s 匹配空白字符
1\d 可以匹配 12、13

a\w 可以匹配 ab、ac

.abc 可以匹配 aabc、~abc、 abc

上面是单个字符匹配，要匹配长字符串在正则表达式中，用 + 表示匹配至少一个字符，用 ? 表示匹配0或1个字符，用 {n} 表示匹配n个字符，用 {n,m} 表示匹配n-m个字符

test.+ 可以匹配 testPython、testPy，无法匹配 test

test? 可以匹配 tes、test，无法匹配 testPython

test.{6} 可以匹配 testPython，无法匹配 testPy

test.{1,6} 可以匹配 testPython、testPy，无法匹配 test

复杂的正则
正则表达式可以更加的复杂：([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})

( )：表示分组

[ ]：表示在[ ]内的任意一个字符

([A-Za-z0-9-.]+)：表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 []、减号 [-]、点号 [.] 中的至少一个字符 [+] ，在正则表达式中减号 [-] 和点号 [.] 是特殊字符需要使用 [] 转义

\@：邮件中的@符号

([A-Za-z0-9-.]+)：表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 []、减号 [-]、点号 [.] 中的至少一个字符 [+]，如：qq，sina

.([A-Za-z]{2,4})：表示以点号 [.] 连接2-4 [{2,4}] 个字符的大写字母 [A-Z] 和小写字母 [a-z]

([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})可以匹配 abc@qq.com、 ABCabc1234@qq.com、 abc_123-xyz@sina.cn
'''
# 如果匹配成功则返回 Match 对象，否则返回 None ，在 Python 中字符串用 \ 转义，使用 r 前缀可以不用考虑转义的问题
# print(re.match(r'1\d','14'))

# 分组  在 group() 函数中group(0)永远是字符串本身，group(1)、group(2)、group(3) …表示第一、第二、第三…个子字符串。
# email = re.match(r'([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})', 'abc@qq.com')
# print(email.group(3))

# 替换 re 模块中提供了 sub() 函数替换子字符串的内容
# test = '021- 1101101 10'
# 删除字符串中的空格
# print(re.sub(r'\s','',test))

# sub() 函数中被替换的字符串也可以使用函数
# 把数字加上100
# def num(match):
#     value = int(match.group('num'))
#     return str(value + 100)
#
# test = 'abc12defg980'
# result = re.sub(r'(?P<num>\d+)', num, test)
# print(result)

'''
在使用 re 模块的时候，Python 帮我们做了两件事：

编译正则表达式，如果正则表示不合法会报错
用编译后的正则表示匹配字符串
'''
# re 模块中可以使用 compile() 函数预编译正则表示
test = re.compile(r'test(.{1,6})')
print(test.match('testPy').groups())
print(test.match('testPython').groups())

'''
compile() 函数构造出来的是一个 Pattern 对象。提供了一些属性读取正则表达的相关信息。

pattern：编译的正则表达式
groups：表达式中的分组数量
flags：编译时的匹配模式
'''
print(test.pattern)
print(test.groups)
print(test.flags)